/*
 * SPDX-FileCopyrightText: 2020-2025 Espressif Systems (Shanghai) CO LTD
 * SPDX-License-Identifier: Apache-2.0
 */

#include <string.h>
#include <stdlib.h>
#include <stdatomic.h>
#include <inttypes.h>

#include "esp_log.h"
#include "esp_idf_version.h"
#include "freertos/FreeRTOS.h"
#include "freertos/task.h"
#include "freertos/ringbuf.h"
#include "driver/gpio.h"
#include "driver/uart.h"
#include "sdkconfig.h"
#include "esp_loader.h"
#include "esp32_port.h"
#include "esp_rom_sys.h"
#include "serial.h"
#include "esp_io.h"

// 定义从机UART参数
#define SLAVE_UART_NUM UART_NUM_1      // 使用的UART端口号
#define SLAVE_UART_BUF_SIZE (2 * 1024) // UART缓冲区大小
#define SLAVE_UART_DEFAULT_BAUD 115200 // 默认波特率

// USB发送环形缓冲区大小（与UART缓冲区一致）
#define USB_SEND_RINGBUFFER_SIZE SLAVE_UART_BUF_SIZE

static const char *TAG = "bridge_serial"; // 日志标签
static QueueHandle_t uart_queue;
// 串口初始化函数
void serial_init(void)
{
    const loader_esp32_config_t serial_conf = {
        .baud_rate = SLAVE_UART_DEFAULT_BAUD,
        .uart_port = SLAVE_UART_NUM,
        .uart_rx_pin = GPIO_RXD,
        .uart_tx_pin = GPIO_TXD,
        .rx_buffer_size = SLAVE_UART_BUF_SIZE * 2,
        .tx_buffer_size = 0,
        .uart_queue = &uart_queue,
        .queue_size = 20,
        .reset_trigger_pin = GPIO_RST,
        .gpio0_trigger_pin = GPIO_BOOT,
    };
    // 卸载现有驱动（如果已安装）
    uart_driver_delete(SLAVE_UART_NUM);
    if (loader_port_esp32_init(&serial_conf) == ESP_LOADER_SUCCESS)
    {
        ESP_LOGI(TAG, "UART & GPIO have been initialized"); // 初始化成功日志

        // 初始化BOOT和RST为高电平
        gpio_set_level(GPIO_RST, 1);
        gpio_set_level(GPIO_BOOT, 1);

    }
    else
    {
        ESP_LOGE(TAG, "loader_port_serial_init failed"); // 错误日志
        abort();                                     // 终止程序
    }
}
void serial_deinit(void)
{
    loader_port_esp32_deinit(); // 关闭串口和GPIO
}

// 设置UART波特率
bool serial_set_baudrate(const uint32_t baud)
{
    static uint32_t current_baudrate = SLAVE_UART_DEFAULT_BAUD; // 当前波特率

    if (current_baudrate == baud)
    { // 如果波特率未变化，直接返回
        return true;
    }

    esp_err_t result = uart_set_baudrate(SLAVE_UART_NUM, baud); // 设置波特率

    if (result == ESP_OK)
    {
        current_baudrate = baud; // 更新当前波特率
    }

    return result == ESP_OK; // 返回是否成功
}